(今天被JSON解析器的bug拖住了,OJ只刷剑指offer)
题目名称
- 序列化二叉树(剑指offer #37)
- 数组中出现超过一半的数字(剑指offer #39)
- 最小的k个数(剑指offer #40)
- 数据流的中位数(剑指offer #41)
- 连续子数组的最大和(剑指offer #42)
- 1~n整数中1出现的次数(剑指offer #43)
序列化二叉树(剑指offer #37)
解题思路
前序遍历,遇到根节点后将其转为字符。接着处理左右子树。反序列化则解析出节点后作为根,然后递归解析左右子树。
解题方案
1 | class Solution { |
数组中超过一半的数字
解题思路
排序后超过一半的数字必然是中位数,我们只需要判断中位数出现的次数是否大于一半即可,但这需要O(nlogn)。不妨采取攻防策略:初始化count为0,遇到一个数后将它认为是目标值。若后续出现了不同的则减1,相同的则加1.若count==0,将则认为目标值是下一个元素,并再将其置1.最后判定目标值是否正确。只需要两次遍历,时间为O(n)。
解题方案
1 | class Solution { |
最小的k个数
解题思路
考察STL中partial_sort的实现,采用大顶堆即可。值得注意的是对于heap_algo需要熟练,先pop_heap再pop_back。进入时先push_back再push_heap。
解题方案
1 | class Solution { |
数据流中位数
解题思路
这道题有点类似于之前做的两个数组的中位数,但有所不同。这道题的核心思想在于使用一个大顶堆和一个小顶堆,保证大堆中的元素比小堆中的元素都要小,则中位数必然在两个堆顶元素中。在执行插入操作时,仅在当前元素小于大顶堆首或大顶堆为空时插入大顶堆,否则默认插入小顶堆。若大顶堆元素个数超出小顶堆两个,将其top push进入小顶堆。若小顶堆元素超过大顶堆一个,则将其top push进入大顶堆。
解题方案
1 | class Solution { |
最大的连续子序列和
解题思路
一维动态规划,f代表当前连续序列和。
解题方案
1 | class Solution { |
1~n整数中1出现的次数
解题思路
根据数位判断个数,具体的思路可见 https://www.nowcoder.com/questionTerminal/bd7f978302044eee894445e244c7eee6 大牛咩咩
提出的方案。(核心就是判断i这一位是大于等于2,还是等于1)
解题方案
1 | class Solution { |